﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <sstream>
#include <cstring>
using namespace std;

//int main()
//{
//    int n = 0, V = 0;
//    cin >> n >> V;
//    vector<int> v(n + 1);
//    vector<int> w(n + 1);
//    for (int i = 1; i <= n; i++)
//    {
//        cin >> v[i] >> w[i];
//    }
//
//    vector<vector<int>> dp1(n + 1, vector<int>(V + 1));
//    vector<vector<int>> dp2(n + 1, vector<int>(V + 1));
//    for (int i = 1; i <= n; i++)
//    {
//        for (int j = 1; j <= V; j++)
//        {
//            dp1[i][j] = dp1[i - 1][j];
//            if (j - v[i] >= 0) dp1[i][j] = max(dp1[i][j], dp1[i - 1][j - v[i]] + w[i]);
//        }
//
//    }
//    cout << dp1[n][V] << endl;
//
//    for (int j = 1; j <= V; j++) dp2[0][j] = -1;
//    for (int i = 1; i <= n; i++)
//    {
//        for (int j = 1; j <= V; j++)
//        {
//            dp2[i][j] = dp2[i - 1][j];
//            if (j - v[i] >= 0 && dp2[i - 1][j - v[i]] != -1)
//            {
//                dp2[i][j] = max(dp2[i][j], dp2[i - 1][j - v[i]] + w[i]);
//            }
//        }
//    }
//    cout << (dp2[n][V] == -1 ? 0 : dp2[n][V]) << endl;
//    return 0;
//}


//#include <iostream>
//#include <cstring>
//#include <unistd.h>
//#include <fcntl.h>
//
//using namespace std;
//
//void SetNonBlock(int fd)
//{
//    int fl = fcntl(fd, F_GETFL);
//    if (fl < 0)
//    {
//        return;
//    }
//    fcntl(fd, F_SETFL, fl | O_NONBLOCK);
//}
//
//int main()
//{
//    int fd = open("./text.txt", O_RDONLY);
//    int f = fcntl(fd, F_DUPFD);
//    if (fd < 0 || f < 0)
//    {
//        cerr << "error" << endl;
//        exit(-1);
//    }
//
//    char buffer[1024];
//    /*ssize_t n = read(fd, buffer, sizeof(buffer));
//    if (n < 0)
//    {
//        cerr << "read error" << endl;
//        exit(-1);
//    }
//    cout << buffer << endl;*/
//
//    memset(buffer, 0, sizeof(buffer));
//    ssize_t n = read(f, buffer, sizeof(buffer));
//    if (n < 0)
//    {
//        cerr << "read error" << endl;
//        exit(-1);
//    }
//    else if (n == 0) cout << "f is empty" << endl;
//    cout << buffer << endl;
//    return 0;
//}


//#include <iostream>
//#include <unistd.h>
//#include <fcntl.h>
//#include <cerrno>
//
//using namespace std;
//
//void SetNonBlock(int fd)
//{
//    // fcntl(fd, F_SETFL, O_NONBLOCK);
//    // 注意：上面的用法不推荐
//    // 为了更稳妥地设置标志，通常建议先将当前标志读取出来，然后修改它们，最后再设置回去。这样可以避免不小心覆盖掉其他重要的标志
//
//    // 先获取文件状态标志
//    int f = fcntl(fd, F_GETFL, 0);
//    if (f < 0)
//    {
//        return;
//    }
//    // 然后将文件设置为非阻塞IO模式
//    fcntl(fd, F_SETFL, f | O_NONBLOCK);
//}
//
//int main()
//{
//    char buffer[1024];
//    // 将stdin设置为非阻塞
//    SetNonBlock(0);
//    while (true)
//    {
//        ssize_t s = read(0, buffer, sizeof(buffer) - 1);
//        if (s > 0)
//        {
//            buffer[s] = 0;
//            cout << "Echo# " << buffer << endl;
//        }
//        // 将标准输入设置为非阻塞，底层关于标准输入的IO条件还没有准备就绪，read返回-1
//        /*else
//        {
//            perror("error");
//            break;
//        }*/
//        else
//        {
//            // 这里要区分开底层IO条件就绪和读取错误，这里使用专门的错误码来区分
//            // 底层关于标准输入的IO条件还没有准备就绪时，错误码被设置为11（EAGAIN或EWOULDBLOCK）
//            if (errno == 11)
//            {
//                cout << "底层数据没有就绪, 下次在试试吧! 做做其他事情！" << endl;
//                sleep(1);
//                continue;
//            }
//            else
//            {
//                cout << "读取错误... s : " << s << " errno: " << errno << endl;
//                sleep(1);
//            }
//        }
//    }
//    return 0;
//}